package com.gree.flowable.app.services;

import com.gree.flowable.app.pojo.ex.FlwExNodeset;
import com.gree.flowable.app.pojo.model.PagerModel;
import com.gree.flowable.app.pojo.model.Query;
import com.gree.flowable.app.pojo.model.QueryDeployMO;
import com.gree.flowable.app.pojo.vo.*;
import org.flowable.bpmn.model.Activity;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.EndEvent;
import org.flowable.bpmn.model.FlowNode;
import org.flowable.task.api.Task;

import java.util.List;
import java.util.Map;

/**
 * @description: BpmnModelservice
 */
public interface IFlowableBpmnModelService {

    /**
     * 通过流程定义id获取BpmnModel
     *
     * @param processDefId 流程定义id
     * @return
     */
     BpmnModel getBpmnModelByProcessDefId(String processDefId);

    /**
     * 通过流程定义id获取所有的节点
     *
     * @param processDefId 流程定义id
     * @return
     */
    List<FlowNode> findFlowNodes(String processDefId);

    /**
     * 获取end节点
     *
     * @param processDefId 流程定义id
     * @return FlowElement
     */
    List<EndEvent> findEndFlowElement(String processDefId);

    /**
     * 判断节点是不是子流程的节点
     * @param processDefId 流程定义id
     * @param activityId 节点id
     * @return
     */
     boolean checkActivitySubprocessByActivityId(String processDefId, String activityId);
    /**
     * 通过流程id获取节点
     *
     * @param processDefId 流程定义id
     * @param activityId   节点id
     * @return
     */
     List<Activity> findActivityByActivityId(String processDefId, String activityId);

    /**
     * 通过流程id获取主流程中的节点
     *
     * @param processDefId 流程定义id
     * @param activityId   节点id
     * @param processDefId
     * @param activityId
     * @return
     */
     FlowNode findMainProcessActivityByActivityId(String processDefId, String activityId);

    /**
     * 查找节点
     * @param processDefId 流程定义id
     * @param activityId 节点id
     * @return
     */
    FlowNode findFlowNodeByActivityId(String processDefId, String activityId) ;

    /**
     * 通过名称获取节点
     *
     * @param processDefId 流程定义id
     * @param name         节点名称
     * @return
     */
    Activity findActivityByName(String processDefId, String name);

    /**
     * 通过任务节点实例ID获取下一节点信息
     * @param taskId
     * @return
     */
    ReturnVO<NextChooseVO> findNextNodesByTaskId(String taskId);

//    /**
//     * 查找用户任务下一节点信息
//     * @param
//     * @return
//     */
//    ReturnVO<NextChooseVO> findNextNodesByTaskId(String processDefId, String activityId);

    /**
     * @Title: 获取当前流程所有用户任务，以节点ID排序
     * @param processDefinitionKey
     * @return
     */
    ReturnVO<List<FlowElementVO>> getFLowElementByProceDefKey(String processDefinitionKey);


    PagerModel<ModelExVO> queryDeployList(QueryDeployMO params, Query query);

    void insertFlwNode(List<FlwExNodeset> elementVos);

    List<NextElementVO> addRoleToList(List<NextElementVO> list, String processKey, int version);

    NextElementVO addRole(NextElementVO param, String processKey, int version);

    Map<String, Integer> findNextNodesByTask(Task task);

    ReturnVO<NextElementVO> findNowNodeByTaskId(String taskId);
}
